package leetcode.code2069;

import leetcode.helper.HelpDebug;

//执行用时：58 ms, 在所有 Java 提交中击败了100.00%的用户
//
//内存消耗：49.6 MB, 在所有 Java 提交中击败了5.13%的用户
//
//通过测试用例：142 / 142
public class Robot {

//	int[][] grid;

	final String north = "North", east = "East", south = "South", west = "West";

	int width, height;

	boolean move;

	int mod;

	int[][] dp;

	int pos;

	// 列，行
	public Robot(int width, int height) {
//		grid = new int[width][height];
		this.width = width;
		this.height = height;
		this.move = false;
		this.mod = ((width + height) << 1) - 4;
		this.dp = new int[this.mod][2];
		this.pos = 0;
		int p = 0;
		for (int i = 0; i < width; i++) {
			this.dp[p][0] = height - 1;
			this.dp[p][1] = i;
			p++;
		}
		for (int i = height - 2; i >= 0; i--) {
			this.dp[p][0] = i;
			this.dp[p][1] = width - 1;
			p++;
		}
		for (int i = width - 2; i >= 0; i--) {
			this.dp[p][0] = 0;
			this.dp[p][1] = i;
			p++;
		}
		for (int i = 1; i < height - 1; i++) {
			this.dp[p][0] = i;
			this.dp[p][1] = 0;
			p++;
		}
	}

	public void step(int num) {
		this.pos = (num + this.pos) % mod;
		this.move = true;
	}

	public int[] getPos() {
		int x = this.dp[pos][0], y = this.dp[pos][1];
		return new int[] { y, height - 1 - x };
	}

	public String getDir() {
		int x = this.dp[pos][0], y = this.dp[pos][1];
		if (!move) {
			return this.east;
		} else if (x > 0 && y == 0) {
			return this.south;
		} else if (y > 0 && x == height - 1) {
			return this.east;
		} else if (y == this.width - 1 && x < height - 1) {
			return this.north;
		} else {
			return this.west;
		}
	}

	public static void main(String[] args) {
		Robot robot = new Robot(6, 3);
		robot.step(2); // 机器人朝东移动 2 步，到达 (2, 0) ，并朝东。
		robot.step(2); // 机器人朝东移动 2 步，到达 (4, 0) ，并朝东。
//		robot.getPos(); // 返回 [4, 0]
		HelpDebug.print(robot.getPos());
		String ans = robot.getDir(); // 返回 "East"
		System.out.println(ans);
		robot.step(2); // 朝东移动 1 步到达 (5, 0) ，并朝东。
						// 下一步继续往东移动将出界，所以逆时针转变方向朝北。
						// 然后，往北移动 1 步到达 (5, 1) ，并朝北。
		robot.step(1); // 朝北移动 1 步到达 (5, 2) ，并朝 北 （不是朝西）。
		robot.step(4); // 下一步继续往北移动将出界，所以逆时针转变方向朝西。
						// 然后，移动 4 步到 (1, 2) ，并朝西。
		HelpDebug.print(robot.getPos()); // 返回 [1, 2]
		ans = robot.getDir(); // 返回 "West"
		System.out.println(ans);

	}

}
